﻿// ***********************************************************************
// Assembly         : ELS
// Author           : linhvn
// Created          : 10-20-2012
//
// Last Modified By : linhvn
// Last Modified On : 10-22-2012
// ***********************************************************************
// <copyright file="UserCommon.cs" company="">
//     Copyright (c) . All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System.Configuration;
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace ELS.User
{
    public class UserCommon
    {
        public static int loggedInUserID = -1;
        // get connection string from app.config file
        public static string connectionString = ConfigurationManager.ConnectionStrings["ELS_ConnectionString"].ToString();

        // Key for saving to Registry
        public static string keyNameRegistry = "ELS";

        // Path User Manual File 
        //public static string filePathUserManual = "C:\\ELS_UserManual.doc";
        public static string filePathUserManual = Application.StartupPath.Replace(@"bin\Debug", @"Resources\ELS_HuongDanSuDung.doc");
        public static string filePathDropTable = Application.StartupPath.Replace(@"bin\Debug", @"DatabaseScript\esl_db_drop_script.sql");
        public static string fileNameUserManual = "ELS_HuongDanSuDung.doc";

        // Path temporary backup file
        public static string fileBackUpPath = Application.StartupPath.Replace(@"bin\Debug", @"Resources\");

        // Prefix Phone number
        public static string preFixPhoneNumber = "(+84)     -      -";

        // string notify for login's status
        public const string LogInFail = "Đăng nhập thất bại";
        public const string LogInNotExitUser = "Không tồn tại người dùng trong hệ thống";
        public const string LogInIncorrectPassword = "Sai mật khẩu";
        public const string LogInSuccess = "Đăng nhập thành công";
        public const string LogInDoNotEnterUsername = "Hãy nhập tên đăng nhập";
        public const string LogInDoNotEnterPassword = "Hãy nhập mật khẩu";

        // notify string  for adding user's status
        public const string AddUser_DoNotEnterUsername = "Hãy nhập tên đăng nhập";
        public const string AddUser_ExistUsername = "Tên đăng nhập đã tồn tại";
        public const string AddUser_DoNotEnterPassword = "Hãy nhập mật khẩu";
        public const string AddUser_DoNotEnterConfirmPassword = "Hãy nhập mật khẩu xác nhận";
        public const string AddUser_NotMatchPassword = "Mật khẩu xác nhận chưa đúng";
        public const string AddUser_Success = "Thêm mới người dùng thành công";
        public const string AddUser_DoNotEnterFullname = "Hãy nhập họ tên";
        public const string AddUser_DoNotEnterEmail = "Địa chỉ email không hợp lệ";        
        public const string AddUser_DoNotSelectGroup = "Hãy chọn vai trò người dùng";

        // notify string for updating user's status
        public const string UpdateUser_DoNotEnterUsername = "Hãy nhập tên đăng nhập";
        public const string UpdateUser_ExistUsername = "Tên đăng nhập đã tồn tại";
        public const string UpdateUser_DoNotEnterPassword = "Hãy nhập mật khẩu";
        public const string UpdateUser_DoNotEnterConfirmPassword = "Hãy nhập mật khẩu xác nhận";
        public const string UpdateUser_NotMatchPassword = "Mật khẩu xác nhận chưa đúng";
        public const string UpdateUser_Success = "Cập nhật người dùng thành công";

        // notify string for updating group's status
        public const string UpdateGroup_DoNotEnterName = "Hãy nhập tên nhóm";
        public const string UpdateGroup_ExistGroup = "Tên nhóm đã tồn tại";                        
        public const string UpdateGroup_Success = "Cập nhật người dùng thành công";
        public const string UpdateGroup_Fail = "Cập nhật người dùng thất bại";

        // notify string for selecting user's status
        public const string SelectUpdateUser_NotMulti = "Không thể chọn nhiều người dùng!";
        public const string SelectUpdateUser_DoNotSelect = "Hãy chọn một người dùng để sửa!";

        // notify string for selecting group's status
        public const string SelectUpdateGroup_NotMulti = "Không thể chọn nhiều nhóm!";
        public const string SelectUpdateGroup_DoNotSelect = "Hãy chọn một nhóm để sửa!";

        // notify string for selecting permission's status
        public const string SelectUpdatePermission_NotMulti = "Không thể chọn nhiều quyền!";
        public const string SelectUpdatePermission_DoNotSelect = "Hãy chọn một quyền để sửa!";

        // notify string for deleting user's status 
        public const string DeleteUpdateUser_DoNotSelect = "Hãy chọn người dùng để xóa!";

        // notify string for log out
        public const string LogOut_Message = "Bạn thật sự muốn đăng xuất?";
        public const string LogOut_MessageBox_Title = "Xác nhận";

        // notify string for deleting user 
        public const string DeleteUser_Message = "Bạn thật sự muốn xóa";
        public const string DeleteUser_MessageBox_Title = "Xác nhận";
        public const string DeleteUser_Success = "Xóa người dùng thành công!";
        public const string DeleteUser_Fail = "Xóa người dùng thất bại!";

        // notify string for deleting group
        public const string DeleteGroup_Message = "Bạn thật sự muốn xóa";
        public const string DeleteGroup_MessageBox_Title = "Xác nhận";
        public const string DeleteGroup_Success = "Xóa nhóm thành công!";
        public const string DeleteGroup_Fail = "Xóa nhóm thất bại!";
        public const string DeleteGroup_DoNotSelect = "Chưa chọn nhóm";

        // notify string for deleting permission
        public const string DeletePermission_Message = "Bạn thật sự muốn xóa";
        public const string DeletePermission_MessageBox_Title = "Xác nhận";
        public const string DeletePermission_Success = "Xóa quyền thành công!";
        public const string DeletePermission_Fail = "Xóa quyền thất bại!";
        public const string DeletePermission_DoNotSelect = "Chưa chọn quyền";

        // notify string for selecting template's status
        public const string SelectUpdateTemplate_NotMulti = "Không thể chọn nhiều mẫu văn bản!";
        public const string SelectUpdateTemplate_DoNotSelect = "Hãy chọn một mẫu văn bản để sửa!";

        // notify string for deleting template 
        public const string DeleteTemplate_Message = "Bạn thật sự muốn xóa";
        public const string DeleteTemplate_MessageBox_Title = "Xác nhận";
        public const string DeleteTemplate_Success = "Xóa mẫu văn bản thành công!";
        public const string DeleteTemplate_Fail = "Xóa mẫu văn bản thất bại!";

        // notify string for deleting user's status 
        public const string DeleteUpdateTemplate_DoNotSelect = "Hãy chọn mẫu văn bản để xóa!";

        public const string AddEditTemplate_DoNotSelectDocumentType = "Hãy chọn đối tượng cho mẫu văn bản!";
        public const string AddEditTemplate_DoNotEnterTemplateTitle = "Hãy nhập tên cho mẫu văn bản!";

        public const string AddEditQuestion_DoNotEnterContent = "Hãy nhập nội dung cho câu hỏi!";
        public const string AddEditQuestion_DoNotEnterQuestionNo = "Hãy nhập số thứ tự cho câu hỏi!";
        public const string AddEditQuestion_DoNotHaveAnyAnswer = "Vui lòng nhập ít nhất một câu trả lời!";
        public const string AddEditQuestion_DoNotHaveContentForAnswer = "Vui lòng nhập nội dung cho câu trả lời!";
        public const string AddEditQuestion_DoNotHavePreviousQuestion = "Bạn đang ở câu hỏi đầu tiên!";

        public const string AddEditQuestion_CanNotUpdateCategoryForMiddleQuestion = "Loại câu hỏi không phù hợp, vui lòng chọn mặc định hoặc cùng loại với câu hỏi trước câu hỏi này!";
        public const string AddEditQuestion_CanNotUpdateCategoryDiffContentWithPreviousQuestion = "Loại câu hỏi không phù hợp, vui lòng chọn cùng loại với câu hỏi trước câu hỏi này!";
        // notify string for adding backup file 
        public const string AddBackUpFile_Success = "Sao lưu cơ sở dữ liệu thành công!";
        public const string AddBackUpFile_Fail = "Sao lưu cơ sở dữ liệu thất bại!";

        // notify string for deleting backup file 
        public const string DeleteBackUpFile_Success = "Xóa thông tin sao lưu cơ sở dữ liệu thành công!";
        public const string DeleteBackUpFile_Fail = "Xóa thông tin sao lưu cơ sở dữ liệu thất bại!";
        public const string DeleteBackUpFile_DoNotSelect = "Hãy chọn thông tin để xóa!";

        // Content of message confirming backup file adding        
        public const string Add_BackupFile_Message = "Bạn thật sự muốn sao lưu cơ sở dữ liệu tại thời điểm hiện tại?";
        public const string Add_BackupFile_MessageBox_Title = "Xác nhận";
        
        // Content of message confirming backup file deletion        
        public const string Delete_BackupFile_Message = "Bạn thật sự muốn xóa thông tin sao lưu cơ sở dữ liệu?";
        public const string Delete_BackupFile_MessageBox_Title = "Xác nhận";

        // Content of message confirming restore file         
        public const string RestoreFile_Message = "Bạn thật sự muốn khôi phục thông tin cơ sở dữ liệu này?";
        public const string RestoreFile_MessageBox_Title = "Xác nhận";
        public const string RestoreFile_Success = "Khôi phục thành công!";
        public const string RestoreFile_Fail = "Khôi phục thất bại";
        public const string RestoreFile_DoNotSelect = "Hãy chọn thông tin để khôi phục!";

        public const int ADMIN = 1;
        public const int REPORTER = 2;
        public const int IMPORTER = 3;        
        public const int UNKNOWN = 4;

        public const int FAIL_STATUS = -1;
        public const int WARNING_STATUS = 0;
        public const int DONE_STATUS = 1;
        public const int NULL_STATUS = 2;

        public const int VIEW_INFO_USER = 0;
        public const int ADD_NEW_USER = 1;        
        public const int EDIT_USER = 2;

        public const int INTERVAL_NOTIFY = 3000;

        // promote text for searching user
        public const string SearchUser_PromoteText = "Tìm kiếm người dùng";

        // promote text for searching template
        public const string SearchTemplate_PromoteText = "Tìm kiếm mẫu văn bản";
        
        // Temporary filename while restoring Db
        public const string TempRestoreFilename = "ELS_script_temp.sql";

        // Table name backup DB
        public const string TableBackupDb = "FileSave";

        /// <summary>
        /// Encrypt a string.
        /// </summary>
        /// <param name="originalString">The original string.</param>
        /// <returns>The encrypted string.</returns>
        /// <exception cref="ArgumentNullException">This exception will be 
        /// thrown when the original string is null or empty.</exception>
        public static string Encrypt(string originalString)
        {
            if (String.IsNullOrEmpty(originalString))
            {
                throw new ArgumentNullException
                       ("The string which needs to be encrypted can not be null.");
            }
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
            StreamWriter writer = new StreamWriter(cryptoStream);
            writer.Write(originalString);
            writer.Flush();
            cryptoStream.FlushFinalBlock();
            writer.Flush();
            return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
        }
        static byte[] bytes = ASCIIEncoding.ASCII.GetBytes("ZeroCool");
        /// <summary>
        /// Decrypt a crypted string.
        /// </summary>
        /// <param name="cryptedString">The crypted string.</param>
        /// <returns>The decrypted string.</returns>
        /// <exception cref="ArgumentNullException">This exception will be thrown 
        /// when the crypted string is null or empty.</exception>
        public static string Decrypt(string cryptedString)
        {
            if (String.IsNullOrEmpty(cryptedString))
            {
                throw new ArgumentNullException
                   ("The string which needs to be decrypted can not be null.");
            }
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream
                    (Convert.FromBase64String(cryptedString));
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read);
            StreamReader reader = new StreamReader(cryptoStream);
            return reader.ReadToEnd();
        }

        static System.Windows.Forms.Timer timerNotification = new System.Windows.Forms.Timer();
        static System.EventHandler timerEvent = new System.EventHandler(OnTimerEvent);
        static long counter = 0;
        //static System.Windows.Forms.Timer timerNotification;
        static TextBox sTbStatus = null;
        static PictureBox sPbStatus = null;
        /// <summary>
        /// Notifies the on mainform.
        /// </summary>
        /// <param name="frm">The FRM.</param>
        /// <param name="message">The message.</param>
        /// <param name="status">The status:
        /// 0: warning
        /// 1: done
        /// -1: fail</param>
        public static void NotifyOnMainForm(TextBox txtStatus, PictureBox pbStatus, string message, int status)
        {
            sTbStatus = txtStatus;
            sPbStatus = pbStatus;
            sTbStatus.Text = message;

            if (status != NULL_STATUS)
            {
                sPbStatus.Visible = true;
                sTbStatus.Visible = true;
                switch (status)
                {
                    case FAIL_STATUS:
                        sPbStatus.Image = Properties.Resources.notification_fail;
                        break;
                    case WARNING_STATUS:
                        sPbStatus.Image = Properties.Resources.notification_warning;
                        break;
                    case DONE_STATUS:
                        sPbStatus.Image = Properties.Resources.notification_done;
                        break;
                }
            }
            else {
                sPbStatus.Visible = false;
                sTbStatus.Visible = false;
                return;
            }

            try
            {                
                if (counter > 0)
                {
                    timerNotification.Tick -= timerEvent;
                    timerNotification.Tick += timerEvent;
                    
                }
                else {
                    timerNotification.Tick += timerEvent;
                }
                counter++;
                timerNotification.Interval = INTERVAL_NOTIFY;
                timerNotification.Enabled = true;
                timerNotification.Start();
                
            }
            catch (Win32Exception e)
            {
                return;
            }
        }
       

        /// <summary>
        /// Called when [timer event].
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        private static void OnTimerEvent(object sender, EventArgs e)
        {
            UserCommon.NotifyOnMainForm(sTbStatus, sPbStatus, String.Empty, NULL_STATUS);
        }
    }
}
